home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / games / nhak_src.zip / ALLMAIN.C next >
C/C++ Source or Header  |  1993-03-16  |  5KB  |  288 lines

  1. /*    SCCS Id: @(#)allmain.c    3.0    89/12/22
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. /* various code that was replicated in *main.c */
  6.  
  7. #include "hack.h"
  8.  
  9. #ifndef NO_SIGNAL
  10. #include <signal.h>
  11. #endif
  12.  
  13. #ifdef OVLB
  14. int NDECL((*afternmv));
  15. int NDECL((*occupation));
  16. #endif
  17.  
  18. #ifdef OVL0
  19.  
  20. void
  21. moveloop()
  22. {
  23. #ifdef MSDOS
  24.     char ch;
  25.     int abort_lev;
  26. #endif
  27.  
  28.     for(;;) {
  29. #ifdef MACOS
  30.     extern    Boolean    lowMem;
  31.     extern    long    lowMemLimit;
  32.     if (!(moves % 20) || lowMem || FreeMem() < lowMemLimit) {
  33.         long tmp = 0;
  34.  
  35.         freeSegs(&tmp);
  36.     }
  37. #endif
  38. #ifdef CLIPPING
  39.         cliparound(u.ux, u.uy);
  40. #endif
  41.         if(flags.move) {    /* actual time passed */
  42.  
  43. #ifdef SOUNDS
  44.             dosounds();
  45. #endif
  46.             settrack();
  47.  
  48.             if(moves%2 == 0 ||
  49.               (!(Fast & ~INTRINSIC) && (!Fast || rn2(3)))) {
  50.                 movemon();
  51. #ifdef HARD
  52.                 if(!rn2(u.udemigod?25:(dlevel>30)?50:70))
  53. #else
  54.                 if(!rn2(70))
  55. #endif
  56.                     (void) makemon((struct permonst *)0, 0, 0);
  57.                 ++monstermoves;
  58.             }
  59.             if(Glib) glibr();
  60.             timeout();
  61.             ++moves;
  62. #ifdef THEOLOGY
  63.             if (u.ublesscnt)  u.ublesscnt--;
  64. #endif
  65.             if(flags.time) flags.botl = 1;
  66. #ifdef POLYSELF
  67.             if(u.mtimedone)
  68.                 if(u.mh < 1) rehumanize();
  69.             else
  70. #endif
  71.                 if(u.uhp < 1) {
  72.                 You("die...");
  73.                 done(DIED);
  74.                 }
  75. #ifdef POLYSELF
  76.             if (u.mtimedone) {
  77.                 if (u.mh < u.mhmax) {
  78.                 if (Regeneration || !(moves%20)) {
  79.                     flags.botl = 1;
  80.                     u.mh++;
  81.                 }
  82.                 }
  83.             }
  84. #endif
  85.             if(u.uhp < u.uhpmax) {
  86.                 if(u.ulevel > 9) {
  87.                     int heal;
  88.  
  89.                     if(HRegeneration || !(moves%3)) {
  90.                     flags.botl = 1;
  91.                     if (ACURR(A_CON) <= 12) heal = 1;
  92.                     else heal = rnd((int) ACURR(A_CON)-12);
  93.                     if (heal > u.ulevel-9) heal = u.ulevel-9;
  94.                     u.uhp += heal;
  95.                     if(u.uhp > u.uhpmax)
  96.                         u.uhp = u.uhpmax;
  97.                     }
  98.                 } else if(HRegeneration ||
  99.                     (!(moves%((MAXULEV+12)/(u.ulevel+2)+1)))) {
  100.                     flags.botl = 1;
  101.                     u.uhp++;
  102.                 }
  103.             }
  104. #ifdef SPELLS
  105.             if ((u.uen<u.uenmax) && (!(moves%(19-ACURR(A_INT)/2)))) {
  106.                 u.uen += rn2((int)ACURR(A_WIS)/5 + 1) + 1;
  107.                 if (u.uen > u.uenmax)  u.uen = u.uenmax;
  108.                 flags.botl = 1;
  109.             }
  110. #endif
  111.             if(Teleportation && !rn2(85)) tele();
  112. #ifdef POLYSELF
  113.             if(Polymorph && !rn2(100))
  114.                 polyself();
  115.             if(u.ulycn >= 0 && !rn2(80 - (20 * night())))
  116.                 you_were();
  117. #endif
  118.             if(Searching && multi >= 0) (void) dosearch0(1);
  119.             hatch_eggs();
  120.             gethungry();
  121.             invault();
  122.             amulet();
  123. #ifdef HARD
  124.             if (!rn2(40+(int)(ACURR(A_DEX)*3))) u_wipe_engr(rnd(3));
  125.             if (u.udemigod) {
  126.                 if (u.udg_cnt) u.udg_cnt--;
  127.                 if (!u.udg_cnt) {
  128.                     intervene();
  129.                     u.udg_cnt = rn1(200, 50);
  130.                 }
  131.             }
  132. #endif
  133.             restore_attrib();
  134.         }
  135.         if(multi < 0) {
  136.             if(!++multi){
  137.                 pline(nomovemsg ? nomovemsg :
  138.                     "You can move again.");
  139.                 nomovemsg = 0;
  140.                 if(afternmv) (*afternmv)();
  141.                 afternmv = 0;
  142.             }
  143.         }
  144.  
  145.         find_ac();
  146.         if(!flags.mv || Blind)
  147.         {
  148.             seeobjs();
  149.             seemons();
  150.             seeglds();
  151.             nscr();
  152.         }
  153.         if(flags.botl || flags.botlx) bot();
  154.  
  155.         flags.move = 1;
  156.  
  157.         if(multi >= 0 && occupation) {
  158. #ifdef MSDOS
  159.             abort_lev = 0;
  160.             if (kbhit()) {
  161.                 if ((ch = Getchar()) == ABORT)
  162.                     abort_lev++;
  163. # ifdef REDO
  164.                 else
  165.                     pushch(ch);
  166. # endif /* REDO */
  167.             }
  168.             if (!abort_lev && (*occupation)() == 0)
  169. #else
  170.             if ((*occupation)() == 0)
  171. #endif
  172.                 occupation = 0;
  173. #ifdef MSDOS
  174.             if(abort_lev || monster_nearby()) {
  175. #else
  176.             if(monster_nearby()) {
  177. #endif
  178.                 stop_occupation();
  179.                 reset_eat();
  180.             }
  181. #ifdef MSDOS
  182.             if (!(++occtime % 7))
  183.                 (void) fflush(stdout);
  184. #endif
  185.             continue;
  186.         }
  187.  
  188.         if((u.uhave_amulet || Clairvoyant) && 
  189. #ifdef ENDGAME
  190.             dlevel != ENDLEVEL &&
  191. #endif
  192.             !(moves%15) && !rn2(2)) do_vicinity_map();
  193.  
  194.         u.umoved = FALSE;
  195.         if(multi > 0) {
  196.             lookaround();
  197.             if(!multi) {    /* lookaround may clear multi */
  198.                 flags.move = 0;
  199.                 continue;
  200.             }
  201.             if(flags.mv) {
  202.                 if(multi < COLNO && !--multi)
  203.                     flags.mv = flags.run = 0;
  204.                 domove();
  205.             } else {
  206.                 --multi;
  207.                 rhack(save_cm);
  208.             }
  209.         } else if(multi == 0) {
  210. #ifdef MAIL
  211.             ckmailstatus();
  212. #endif
  213.             rhack(NULL);
  214.         }
  215.         if(multi && multi%7 == 0)
  216.             (void) fflush(stdout);
  217.     }
  218. }
  219.  
  220. #endif /* OVL0 */
  221. #ifdef OVL1
  222.  
  223. void
  224. stop_occupation()
  225. {
  226.     if(occupation) {
  227.         You("stop %s.", occtxt);
  228.         occupation = 0;
  229.         sync_hunger();
  230. #ifdef REDO
  231.         multi = 0;
  232.         pushch(0);
  233. #endif
  234.     }
  235. }
  236.  
  237. #endif /* OVL1 */
  238. #ifdef OVLB
  239.  
  240. void
  241. newgame() {
  242. #ifdef DGK
  243.     gameDiskPrompt();
  244. #endif
  245.  
  246.     fobj = fcobj = invent = 0;
  247.     fmon = fallen_down = 0;
  248.     ftrap = 0;
  249.     fgold = 0;
  250.     flags.ident = 1;
  251.  
  252.     init_objects();
  253.     u_init();
  254.  
  255. #ifndef NO_SIGNAL
  256.     (void) signal(SIGINT, (SIG_RET_TYPE) done1);
  257. #endif
  258.  
  259.     mklev();
  260.     u.ux = xupstair;
  261.     u.uy = yupstair;
  262.     (void) inshop();
  263.  
  264.     setsee();
  265.     flags.botlx = 1;
  266.  
  267.     /* Move the monster from under you or else
  268.      * makedog() will fail when it calls makemon().
  269.      *             - ucsfcgl!kneller
  270.      */
  271.     if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy));
  272.  
  273. #ifdef CLIPPING
  274.     cliparound(u.ux, u.uy);
  275. #endif
  276.     (void) makedog();
  277.     seemons();
  278. #ifdef NEWS
  279.     if(flags.nonews || !readnews())
  280.         /* after reading news we did docrt() already */
  281. #endif
  282.         docrt();
  283.  
  284.     return;
  285. }
  286.  
  287. #endif /* OVLB */
  288.